import React, {Component} from 'react';
import Markdown from 'react-markdown';


class JsPage extends Component {
    constructor(props) {
        super(props);
    }


    render() {

        return (
            <div>
                <Markdown source={"# 防御性编程\n\n" +
                "防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件，我们要设计系统中的每个组件，以使其尽可能地“保护”自己。我们通过明确地在代码中对设想进行检查，击碎了未记录下来的设想。这是一种努力，防止（或至少是观察）我们的代码以将会展现错误行为的方式被调用。\n\n" +
                "防御性编程是一种编程习惯，是指预见在什么地方可能会出现问题，然后创建一个环境来测试错误，当预见的问题出现的时候通知你，并执行一个你指定的损害控制动作，如停止程序执行，将用户重指向到一个备份的服务器，或者开启一个你可以用来诊断问题的调试信息。\n\n" +
                "防御性编程是一种面向失败的设计思想，用以对抗软件系统的墨菲定律。在实现中对可能失败的诱因主动隔离，将失败带来的影响最小化，防止错误蔓延导致灾难性事件的发生。防御性编程可以让系统更健壮。\n\n" +
                "### 常用的防御性编程手段\n\n" +
                "**Null值处理**,字符串判断是否某个常量用\"xxx\".equals(string)而不是string.equals(\"xxx\")，因为string有可能是null。当然最好是用Apache common工具包里的StringUtils。\n\n" +
                "**边界检查**,当从外部接口传入参数时，需要检查参数是否符合要求：是否为空，数值的话是否在要求范围内，数据是否过大可能导致OOM等等。\n\n" +
                "**失败重试**,成功率要求极高的情况下，需要做到失败重试。\n\n" +
                "**异常处理**,出现异常，不要直接抛出调用方无法处理的异常堆栈给调用方，将皮球提给上级没有意义，要返回“无害”和“有用”的数据。\n\n" +
                "**线程安全**,并发环境下，除了代码本身的线程安全，也要注意引入二方包/框架的实现是否线程安全。\n\n" +
                "**兜底**,异常场景考虑的再多，也不可能全部覆盖到。此时兜底方案就成了最后的救命稻草。\n\n" +
                "### 防御性变更\n\n" +
                "**回滚方案**,未虑胜，先虑败。变更的时候要做回滚计划，考虑到失败时候的回滚方案，止血计划。\n\n" +
                "**灰度**,beta\n\n" +
                "**低峰发布**\n\n" +
                "**变更完观察日志**\n\n" +
                "**第二天高峰期前到工位**\n\n" +
                "**开关**\n\n" +
                "**后门**\n\n" +
                ""}/>

            </div>

        );
    }
}

export default JsPage;